//
// Created by LiuYou on 2021/10/29.
//

#include <iostream>
#include <unistd.h>
#include <cstring>


static const int LEFT = 30000000;
static const int RIGHT = 30000200;
static const int THREAD_NUM = RIGHT - LEFT + 1;

static pthread_t tidArray[THREAD_NUM];
//static int threadArgs[THREAD_NUM];


int main(int argc, char** argv) {

    for (int i = LEFT; i <= RIGHT; ++i) {
//        threadArgs[i - LEFT] = i;

        int* pInt = static_cast<int*>(malloc( sizeof( int )));
        *pInt = i;

        int errorNumber = pthread_create( tidArray + (i - LEFT), nullptr,
                                          [](void* args) -> void* {

                                              int* pInt = static_cast<int*>(args);
                                              int num = *pInt;

                                              int mark{1};
                                              for (int j = 2; j < num / 2; ++j) {
                                                  if (num % j == 0) {
                                                      mark = 0;
                                                      break;
                                                  }
                                              }
                                              if (mark == 1) {
                                                  printf( "%d 是一个质数。\n", num );
                                              }


                                              pthread_exit( args );

                                          },
//                                          (void*) (threadArgs + (i - LEFT)));
                                          pInt );
        // 一般情况下是不会出错的。
        if (errorNumber != 0) {
            fprintf( stderr, "pthread_create(): %s.\n", strerror(errno));
            return 1;
        }

    }

    for (int i = 0; i < THREAD_NUM; ++i) {
        void* threadReturn{};
        pthread_join( tidArray[i], &threadReturn );
        // todo 笔记: 这样的话, malloc(); 和 free(); 就在同一个函数中了。
        //  这是一种比较好的设计。
        free( threadReturn );
    }


    return 0;
}
